﻿/**
 * \file Position.cs
 * \brief Classe Position
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */
namespace Implem
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

    /**
     * \class Position
     * \brief Objet representant une position sur la carte
     */
	public class Position
	{
        /*!< Abscisse de la position */
        private int _x;

        /*!< Propriete accedant a l'attribut _x de la position */
		public int X
		{
            get { return _x; }
            set { _x = value; } 
		}

        /*< Ordonnee de la position */
        private int _y;

        /*!< Propriete accedant a l'attribut _y de la position */
		public int Y
		{
            get { return _y; }
            set { _y = value; } 
		}

        /**
         * \fn public Position(int x,int y)
         * \brief Constructeur de Position
         * \param x l'abcisse
         * \param y l'ordonnee
         */
        public Position(int x, int y)
        {
            _x = x;
            _y = y;
        }

        /***** Methodes permettant d'assurer un hachage fonctionnel *****/

        /**
         * \fn public override int GetHashCode()
         * \brief Methode de hachage des positions
         * \return le hachage correspondant a la position courante
         */

        public override int GetHashCode()
        {
            return X ^ Y;
        }

        /**
         * \fn public override bool Equals(System.Object obj)
         * \brief Teste si une position p est identique a la position courante
         * \param obj l'objet a tester
         * \return vrai si le test est un succes, faux sinon
         */
        public override bool Equals(System.Object obj)
        {
            // Si le parametre est null, retourne false
            if (obj == null)
            {
                return false;
            }

            // Si le parametre ne peut pas etre caste en Position, retourne false
            Position p = obj as Position;
            if ((System.Object)p == null)
            {
                return false;
            }

            // Retourne vrai si les deux attributs sont egaux
            return (this.X == p.X) && (this.Y == p.Y);
        }


        /**
         * \fn public override bool Equals(Position p)
         * \brief Teste si une position p est identique a la position courante
         * \param p la position a tester
         * \return vrai si le test est un succes, faux sinon
         */
        public bool Equals(Position p)
        {
            // Si le parametre ne peut pas etre caste en Position, retourne false
            if ((object)p == null)
            {
                return false;
            }

            // Retourne vrai si les deux attributs sont egaux
            return (this.X == p.X) && (this.Y == p.Y);
        }
        


        /***** Methodes additionnelles *****/
        /**
         * \fn public bool posProche(Position p)
         * \brief Teste si une position p est adjacente a la position courante
         * \param p la position a tester
         * \return vrai si le test est un succes, faux sinon
         */
        public bool posProche(Position p)
        {
            return p._x>=(this._x-1) && p._x<=(this._x+1) && p._y>=(this._y-1) && p._y<=(this._y+1);
        }

        public double distance(Position p)
        {
            double sqX = (this._x - p._x) * (this._x - p._x);
            double sqY = (this._y - p._y) * (this._y - p._y);
            return Math.Sqrt(sqX + sqY);
        }

	}
}

